{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a name=\"top\"></a><img src=\"source/SpinalHDL.png\" alt=\"SpinalHDL based on Scala\" style=\"width:320px;\" />"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "  Before running Spinal HDL code, be sure to load SpinalHDL Libraries  \n",
    "**Note** : This may be a little slow when the first time load, please wait a moment to download Lib from remote.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "val path = System.getProperty(\"user.dir\") + \"/source/load-spinal.sc\"\n",
    "interp.load.module(ammonite.ops.Path(java.nio.file.FileSystems.getDefault().getPath(path)))"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Stream\n",
    "\n",
    "The Stream interface is a simple handshake protocol to carry payload.\n",
    "It could be used for example to push and pop elements into a FIFO, send requests to a UART controller, etc.\n",
    "![image.png](attachment:image.png)\n",
    "There is some examples of usage in SpinalHDL :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class StreamFifo[T <: Data](dataType: T, depth: Int) extends Component {\n",
    "  val io = new Bundle {\n",
    "    val push = slave Stream (dataType)\n",
    "    val pop = master Stream (dataType)\n",
    "  }\n",
    "  io.pop << io.push\n",
    "}\n",
    "\n",
    "class StreamArbiter[T <: Data](dataType: T,portCount: Int) extends Component {\n",
    "  val io = new Bundle {\n",
    "    val inputs = Vec(slave Stream (dataType),portCount)\n",
    "    val output = master Stream (dataType)\n",
    "  }\n",
    "  io.inputs\n",
    "}"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "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CSecILQim2222QrH5G143/vep+OPPz5vV8O2OJvJ1VdfnW4/uGR6pPQYr1cTgXRaqauq2cSxbtUDktagh2eccYZ22223se5sjzvnAVKPAXV1nSNgwtk5dj6yfwhgTq/J/PnzlSWb7IBIrrvuuqFU4+KSSy7RRRddVNvINJe77767fvzjH+u2225TOz6g1113XWPFBf/RPqJlX//61+v222+Ppfyij0iM/hJttGV4CNwXCefWW289vFb4zEbACHSFgAlnV/D54D4hMCPWWxSV/tvf/lZPe9rTtPrqq+tjH/uYVl55ZW244YY67LDD4qG15YwZM7TKKqvokUceqW9H+3nQQQfpCU94gp785Cfr8MMP19TUlD7/+c/rsssuq5U/+GAUlI/LlVdeqS9+8Ys65phjtOqqq8bNDUvmXYfQ0t44l3vI2WiNWANS/scIGAEjYAQmEQETzkm86tXv80qtmnjnnXdqzTXX1FlnnVUzq7/zne/UmWeeqbvuukv33Xef9thjj1oVF198sfbZZx+tsUbNIlfbdsUVV9Ty9BHxSi4/tKGPPfaYqPO0007TjTfeqG9/+9u1shdeeKGOPfbYmgaziGymbc0Qzq9Kuifdn6w/P1mfpFVHpk/S1XZfjcDoI0DsRtRAHOoE+p1fUBPO1tiRDiGa1OKy9VEu0Q0CRHnXtJxXXXVV0wTO73jHO/TJT35Sb3zjG2vEE/P2WmutpdNPP712/gcffFB77bWXLr/88np7nve859V8M9F6Xn/99dpoo420ZMmSmkmcQptsson233//Wpn3v//9NcK69tpr145Hk3n00UcXtunuu++un0fSpJLKFIPsul0Nsoj4fyNgBIzABCDgtEitLzKEkxEOPxPO1niVKQGOMfI3j4DUcUYDCekskvPOO0/77befvvWtb+nWW2/VT37yk4aimNwhlPfcs1zR+JGPfEQHHHBAjThuuummtfIvetGLdM0119TW//SnP+nII4/U+uuvXyOq+H+iBcVPk8Cg7bffPneGEw7OtPUlkop+VzQ01P8YASNgBIyAERhjBKzhHOOLO8Jdg+TPZ4YhTOTbbLON9txzz5qmEQ1jKs985jO177771vw3b7jhBuF7iUn97W9/e60YpnKII3n6fvSjH9W2EfkOkX344YdrPza+7nWv0wc/+EERmX7HHXfU6vne975X8/M85ZRT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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The following code will create this logic :\n",
    "![image.png](attachment:image.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "case class RGB(channelWidth : Int) extends Bundle{\n",
    "  val red   = UInt(channelWidth bit)\n",
    "  val green = UInt(channelWidth bit)\n",
    "  val blue  = UInt(channelWidth bit)\n",
    "\n",
    "  def isBlack : Bool = red === 0 && green === 0 && blue === 0\n",
    "}\n",
    "\n",
    "class Top extends Component{\n",
    "  val source = slave Stream(RGB(8))\n",
    "  val sink   = master Stream(RGB(8))\n",
    "  sink <-< source.throwWhen(source.payload.isBlack) \n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import spinal.lib._\n",
    "class Top extends Component{\n",
    "val streamA,streamB = Stream(Bits(8 bits))\n",
    "slave(streamA)\n",
    "master(streamB)\n",
    "//...\n",
    "val myFifo = StreamFifo(\n",
    "    dataType = Bits(8 bits),\n",
    "    depth    = 128)\n",
    " \n",
    "myFifo.io.push << streamA\n",
    "myFifo.io.pop  >> streamB\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Flow"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "case class RGB(channelWidth: Int) extends Bundle{\n",
    "  val red   = UInt(channelWidth bit)\n",
    "  val green = UInt(channelWidth bit)\n",
    "  val blue  = UInt(channelWidth bit)\n",
    "  def isBlack : Bool = red === 0 && green === 0 && blue === 0\n",
    "} \n",
    "\n",
    "class MyRGB extends Component{\n",
    "  val source = slave  Stream(RGB(8))\n",
    "  val sink   = master Stream(RGB(8))\n",
    "  sink <-< source.s2mPipe\n",
    "} \n",
    "\n",
    "class T3 extends Component{\n",
    " val a = in(UInt(8 bits))\n",
    " val b = out(UInt(8 bits))\n",
    " b := a + 133\n",
    "}\n",
    "showRtl(new T3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Myflow1 extends Component{\n",
    "    val source = slave  Flow(RGB(8))\n",
    "    val sink   = master Flow(RGB(8))\n",
    "    sink <-< source \n",
    "}\n",
    "\n",
    "showRtl(new Myflow1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class T1 extends Component{\n",
    "    val a = slave Flow(UInt(8 bits) )\n",
    "    val b = master Flow(UInt())\n",
    "    val tmp = a.toStream\n",
    "    b := tmp.toFlow\n",
    "}\n",
    "showRtl(new T1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class T1 extends Component{\n",
    "    val a = slave Stream(UInt(8 bits))\n",
    "    val b = master Flow(UInt(8 bits) ) \n",
    "    b << a.toFlow\n",
    "}\n",
    "showRtl(new T1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "case class FilterConfig(iqWidth: Int, \n",
    "                        tapNumbers: Int = 33,\n",
    "                        hwFreq: HertzNumber = 200 MHz, \n",
    "                        sampleFreq: HertzNumber = 1.92 MHz)\n",
    "\n",
    "case class IQ(width: Int) extends Bundle{\n",
    "  val I,Q = SInt(width bits)\n",
    "}\n",
    "\n",
    "class Filter(fc: FilterConfig) extends Component{\n",
    "  //val din   = slave Flow(IQ(fc.iqWidth))\n",
    "  //val dout  = master Flow(IQ(fc.iqWidth))\n",
    "  val din   = slave Flow(Bits(32 bits))\n",
    "  val dout  = master Flow(Bits(32 bits))\n",
    "  val flush = in Bool\n",
    "    \n",
    "  val clockSMP = ClockDomain.external(\"smp\")\n",
    "  val clockHW = ClockDomain.external(\"hw\")\n",
    "    \n",
    "  val u_fifo_in = StreamFifoCC(\n",
    "      dataType = Bits(32 bits), \n",
    "      depth = 8,\n",
    "      pushClock = clockSMP,\n",
    "      popClock = clockDomain\n",
    "  )\n",
    "    \n",
    "  u_fifo_in.io.push << din.toStream \n",
    "  dout << u_fifo_in.io.pop.toFlow\n",
    "    \n",
    "}\n",
    "\n",
    "showRtl(new Filter(FilterConfig(8)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class IQ extends Bundle{\n",
    "  val I, Q = SInt(8 bits)\n",
    "}\n",
    "class Filter extends Component{\n",
    "    val din = slave Flow(new IQ)    \n",
    "    val dout = master Stream(new IQ)\n",
    "    dout << din.toStream.queue(16)\n",
    "}\n",
    "showRtl(new Filter)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "case class Color(channelWidth: Int) extends Bundle {\n",
    "  val r,g,b = UInt(channelWidth bits)\n",
    "}\n",
    "class T3 extends Component{\n",
    "  val io = new Bundle{\n",
    "   val input  = in (Color(8) )\n",
    "   val output = out(Color(8))\n",
    "}\n",
    "    io.output <> io.input\n",
    "}\n",
    "showRtl(new T3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## rgb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    " \n",
    "case class Rgb(channelWidth: Int) extends Bundle{\n",
    "  val r = UInt(channelWidth bits)\n",
    "  val g = UInt(channelWidth bits)\n",
    "  val b = UInt(channelWidth bits)\n",
    "    \n",
    "  def init(x: Int): Rgb = {\n",
    "      r init U(x)\n",
    "      g init U(x)\n",
    "      b init U(x)\n",
    "      this\n",
    "  }\n",
    "  def clear = {\n",
    "      this.r := 0\n",
    "      this.g := 0\n",
    "      this.b := 0\n",
    "      this\n",
    "  }\n",
    " // override def clone :Rgb = Rgb.asInstanceOf[this.type]\n",
    "}\n",
    "\n",
    "class T3 extends Component{\n",
    "    val a = slave Flow(Rgb(8))     \n",
    "    val flush = in Bool()\n",
    "    val b = master Flow(Rgb(8))\n",
    "    \n",
    "    val retReg = Reg(cloneOf(a.payload)) init 0    \n",
    "    \n",
    "    when(flush){\n",
    "       retReg.clear\n",
    "    }.otherwise{\n",
    "       retReg := a.payload\n",
    "    }\n",
    "    \n",
    "    b.payload := retReg\n",
    "    b.valid := True\n",
    " \n",
    "}\n",
    "showRtl(new T3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## StreamFIFO\n",
    "- readsync readyasync optional for depth > 1\n",
    "- occupanccy/avalibility optinal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "showRtl(StreamFifo(UInt(8 bits),1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    " //val a = slave  Stream(UInt( 8 bits)) \n",
    " //val b = master Stream(UInt(8 bits))\n",
    " //    b := a.queue(4)\n",
    "    Stream(UInt(8 bits)).queue(4)\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Mem \n",
    "- `readSync`  get value next cycle\n",
    "- `readAsync` get value current cycle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "    val addr = in UInt(5 bits)\n",
    "    val b = out UInt(8 bits)\n",
    "    \n",
    "    val ram = Mem(UInt(8 bits),32)\n",
    "    \n",
    "    b := ram.readAsync(addr) \n",
    "    //b := ram.readSync(addr) \n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Fragment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "  val a = slave Flow(Fragment(UInt(8 bits)))\n",
    "  val b = out UInt()\n",
    "  val c = out UInt()\n",
    "  b := a.payload.fragment  //\n",
    "  c := a.fragment          // can be omitted\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Custom your owner bundle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "case class wrPort[T <: Data](val payloadType: HardType[T]) extends Bundle with IMasterSlave {\n",
    "  val wr    = Bool()\n",
    "  val waddr = UInt(8 bits)\n",
    "  val wdata: T = payloadType()\n",
    "  override def asMaster(): Unit = out(this)\n",
    "  override def clone: wrPort[T] = wrPort(payloadType).asInstanceOf[this.type]\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "    val wr = slave(wrPort(Vec(SInt(8 bits), 4)))\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Scala",
   "language": "scala",
   "name": "scala"
  },
  "language_info": {
   "codemirror_mode": "text/x-scala",
   "file_extension": ".scala",
   "mimetype": "text/x-scala",
   "name": "scala",
   "nbconvert_exporter": "script",
   "version": "2.12.8"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
